์ฐธ๊ณ :
https://supabase.com/docs/guides/database/database-advisors?queryGroups=lint&lint=0011_function_search_path_mutable
์์ธ
In PostgreSQL, the
search_pathdetermines the order in which schemas are searched to find unqualified objects (like tables, functions, etc.)
search_path๋ํ
์ด๋ธ๊ณผ ํจ์๊ฐ์ unqualified objects๋ค์ ์ฐพ์๋ ์ด๋ค ์คํค๋ง์์ ์ฐพ์์ง ์ค์ ํ๋๊ฒ์ด๋ผ๊ณ ํ๋ค. ์ฌ์ฉ์์ ๊ธฐ๋ณธ search_path๊ฐ ์๋ค๊ณ ํด๋ ํจ์๋ฅผ ๋ง๋ค๋ ๋ฐ๋ก ์์ฑํ๋๊ฒ์ ๊ถ์ฅํ๋ค๊ณ ํ๋ค.
Search Path๋?
profiles๋ผ๋ unqualified object(ํ
์ด๋ธ, ํจ์ ๋ฑ)๊ฐ ์๊ณ (public.profiles์ฒ๋ผ ์์ ์คํค๋ง์ ์ด๋ฆ๊น์ง ์์ฑํ๋ฉด qualified object๊ฐ ๋๋ค.) ์ด๊ฑธ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ์ฐธ๊ณ ํ ์คํค๋ง์ ์ด๋ฆ๋ค์ด ์ ํ ๋ฆฌ์คํธ๊ฐ search_path๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก search_path๋ ์ฌ์ฉ์์ ์คํค๋ง์ public ์คํค๋ง๋ฅผ ๋ด๊ณ ์๋ค. ๊ทธ๋ฌ๋ ๋ง์ผ์ ๊ฒฝ์ฐ์ ๋๋นํด search_path๋ฅผ ํน์ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข๋ค๊ณ ํ๋๋ฐ, ์๋ํ๋ฉด ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์๋ง๋ค ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ๋ค์ด ์ด๋ค ํจ์ example_function()์์ profiles ํ
์ด๋ธ์์ ์๋ฃ๋ฅผ ๊ฐ์ ธ์ ๋ฐํํ๋๋ฐ search_path๊ฐ ํน์ ๋์ด์์ง ์์๋ค๊ณ ํ๋ค๋ฉด, sales์คํค๋ง์ ์ํ ์ฌ์ฉ์๊ฐ ํจ์๋ฅผ ํธ์ถํ ๋์ develpoment์คํค๋ง์ ์ํ ์ฌ์ฉ์๊ฐ ํจ์๋ฅผ ํธ์ถํ ๋ example_function()์ ๊ฐ๊ฐ ์ฌ์ฉ์๋ค์ด ์ํ ์คํค๋ง์ profilesํ
์ด๋ธ์ ์ฐธ๊ณ ํ๊ฒ ๋๋ค.(๋ ์คํค๋ง ๋ชจ๋ profiles๋ผ๋ ํ
์ด๋ธ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด)
ํด๊ฒฐ
ํจ์๋ฅผ ๋ง๋ค ๋ DDL์ ๋ค์๊ณผ ๊ฐ์ ์ค์ ์ ์ถ๊ฐํ๋ค.
create or replace function example_function()
returns void
language sql
set search_path = '' -- ์ฌ๊ธฐ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
as $$
....
$$;
๋น ๋ฌธ์์ด๋ก ์ค์ ํ๊ธฐ
์ํ๋ฒ ์ด์ค๋ ํนํ search_path = ''๋ก ์ค์ ํ๊ธฐ๋ฅผ ๊ถ์ฅํ๋ค๊ณ ํ๋ค.
๋น ๋ฌธ์์ด๋ก ์ค์ ํ๋ฉด search_path๋ฅผ ์ฌ์ค์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด๊ณ ,
ํจ์ ๋ด๋ถ์์ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋ unqualified์ธ ์ํ๋ก ์ฐธ์กฐํ์ง ๋ชปํ๊ณ ๋ฐ๋์ ์คํค๋ง ๋ช
์ ๋ช
์ํ qualified ์ํ(schema.object)๋ก ์ฐธ์กฐํด์ผํ๊ธฐ ๋๋ฌธ์ ์คํค๋ง ์ด๋ฆ์ ๋ช
์ํด์ผํ๋ค.
์คํค๋ง๋ช
์ ๋ช
์ํด์ผ๋๊ธฐ ๋๋ฌธ์ ํตํด ์์ธก ๋ถ๊ฐ๋ฅํ ๋์undexpected behavior์ ๋ฐฉ์งํ๊ณ , ๋ณด์ ์ทจ์ฝ์ฑsecurity vulnerabilities์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ถ์ฅํ๋ค๊ณ .
๋ช
ํ์ฑ, ์ผ๊ด์ฑ, ๋ณด์์ฑ์ ๋์ด๊ธฐ ์ํ ๋ฐฉ์ด์ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ฐฉ๋ฒ.